package com.chap10;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * Created by IntelliJ IDEA.
 * User: bj910
 * Date:2023-03-29
 * Time: 4:59
 * To change this template use File | Settings | File Templates.
 */
public class FlowControl {
    public static final int MAX_REQUESTS = 100;//最大请求数量
    public static final int MAX_WAIT_TIME = 1000;//最大等待时间(毫秒)
    public static final ArrayBlockingQueue<Object> queue = new ArrayBlockingQueue<>(MAX_REQUESTS);

    public static void main(String[] args) throws InterruptedException {
        new Thread(()->{
            handleRequest();
        }).start();

        //模拟200次请求
        //限流可以对流量进行削峰，每秒只能处理100个请求，
        // 但是峰值一下来了200个请求，剩下100个请求直接拒绝？不用
        //平滑的过度到下一秒
        for (int i = 0; i < 200; i++) {
            //队列满了，等待一段时间，再重新尝试
            if (queue.size() >= MAX_REQUESTS){
                System.out.println("队列满了，等待一段时间，再重新尝试");
                //休眠1秒 平滑的过度到下一秒
                TimeUnit.MICROSECONDS.sleep(MAX_WAIT_TIME);
            }
            //将请求任务添加到队列
            //添加一个元素，添加成功返回true, 如果队列满了，返回false
            queue.offer(new Object());
        }
    }

    private static void handleRequest(){
        while (true){
            //返回并删除队首元素，队列为空则返回null
            //获取队列中的请求
            Object request = queue.poll();
            if (request!=null){
                //处理请求
                System.out.println("模拟处理请求："+request.toString());
                //模拟处理时间
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
